package com.example.querydsl.controller;

import com.example.querydsl.entity.GoodDTO;
import com.example.querydsl.entity.GoodEntity;
import com.example.querydsl.entity.QGoodEntity;
import com.example.querydsl.entity.QGoodTypeEntity;
import com.querydsl.core.types.Projections;

import com.querydsl.jpa.impl.JPAQueryFactory;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author Anita
 * @Date 2017/12/20 15:21
 */
@RestController
@Slf4j
public class GoodController {

    @Autowired
    private EntityManager entityManager;

    private JPAQueryFactory queryFactory;

    @PostConstruct
    public void initFactory(){
        queryFactory = new JPAQueryFactory(entityManager);
    }

    @RequestMapping("/selectByType")
    public List<Integer> selectByType(@RequestParam("typeId")Long typeId){
        //商品查询实体
        QGoodEntity _good = QGoodEntity.goodEntity;
        //商品类型查询实体
        QGoodTypeEntity _good_type = QGoodTypeEntity.goodTypeEntity;

        return queryFactory
                .select(_good.order)
                .from(_good,_good_type)
                .where(
                        _good.type.id.eq(_good_type.id)
                                  .and(
                                          _good_type.id.eq(typeId)
                                  )
                )
                .orderBy(_good.id.desc())
                .fetch();
    }

    @RequestMapping("/leftjoin")
    public List<GoodEntity> selectByTypeLeftJoin(@RequestParam("typeId") Long typeId){
        //商品查询实体
        QGoodEntity _good = QGoodEntity.goodEntity;
        //商品类型查询实体
        QGoodTypeEntity _good_type = QGoodTypeEntity.goodTypeEntity;

        return queryFactory
                .select(_good)
                .from(_good)
                .innerJoin(_good.type,_good_type)
                .on((_good_type.id.eq(typeId)))
                .orderBy(_good.id.desc())
                .fetch();

    }

//    @RequestMapping("/selectWithQueryDSL")
//    public List<GoodDTO> selectWithQueryDSL(){
//        //商品查询实体
//        QGoodEntity _good = QGoodEntity.goodEntity;
//        //商品类型查询实体
//        QGoodTypeEntity _good_type = QGoodTypeEntity.goodTypeEntity;
//
//        return queryFactory
//                .select(
//                        Projections.bean(
//                                GoodDTO.class,
//                                _good.id,
//                                _good.price,
//                                _good.title,
//                                _good.unit,
//                                _good_type.name.as("typeName"),
//                                _good_type.id.as("typeId")
//                        ))
//                .from(_good,_good_type)
//                .where(_good.typeId.eq(_good_type.id))
//                .orderBy(_good.id.desc())
//                .fetch();
//    }

}
